package com.thunisoft.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;

/**
 * @title FreeMarkerUtil.java
 * @package com.thunisoft.util
 * @projectName spring.boot
 * @author yzj 
 * @date 2020年5月28日 上午10:51:30
 */
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import sun.misc.BASE64Encoder;

public class FreeMarkerUtil {

	private static final String ENCODING = "UTF-8";
	private static Configuration cfg = new Configuration();

	// 初始化cfg
	static {
		// 设置模板所在文件夹
		cfg.setClassForTemplateLoading(FreeMarkerUtil.class, "/templates/word");
		// setEncoding这个方法一定要设置国家及其编码，不然在ftl中的中文在生成html后会变成乱码
		cfg.setEncoding(Locale.getDefault(), ENCODING);
		// 设置对象的包装器
		cfg.setObjectWrapper(new DefaultObjectWrapper());
		// 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
		cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

	}

	// 获取模板对象
	public static Template getTemplate(String templateFileName) throws IOException {
		return cfg.getTemplate(templateFileName, ENCODING);
	}

	/**
	 * 据数据及模板生成文件
	 * 
	 * @param data             Map的数据结果集
	 * @param templateFileName ftl模版文件名
	 * @param outFilePath      生成文件名称(可带路径)
	 */
	public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {
		Writer out = null;
		File outFile = new File(outFilePath);
		try {
			// 获取模板,并设置编码方式，这个编码必须要与页面中的编码格式一致
			Template template = getTemplate(templateFileName);
			if (!outFile.getParentFile().exists()) {
				outFile.getParentFile().mkdirs();
			}
			out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);
			// 处理模版
			template.process(data, out);
			out.flush();

		} catch (Exception e) {

			e.printStackTrace();
		} finally {
			try {
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {

				e.printStackTrace();
			}
		}
		return outFile;
	}

	// 获得图片的base64码
	public static String getImageBase(String src) throws Exception {
		if (src == null || src == "") {
			return "";
		}
		File file = new File(src);
		if (!file.exists()) {
			return "";
		}
		InputStream in = null;
		byte[] data = null;
		try {
			in = new FileInputStream(file);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(data);
	}

	public static void main(String[] args) {
		try {
			
			JSONObject data=new JSONObject();
			data.put("xmmc", "aaa");
			
			
			List<Hjxx> list=new ArrayList<Hjxx>();
			Hjxx lx=new Hjxx();
			lx.setHjMc("立项");
			List<Lcxx> lcxxs=new ArrayList<Lcxx>();
			Lcxx lcxx1=new Lcxx();
			lcxx1.setLcmc("初稿");
			List<String> sxs=new ArrayList<>();
			sxs.add("可行性研究方案初稿上传时间，2020年10月23日。");
			sxs.add("可行性研究方案初稿，2020年10月25日。");
			lcxx1.setSx(sxs);
			
			Lcxx lcxx2=new Lcxx();
			lcxx2.setLcmc("正式版");
			List<String> sxs2=new ArrayList<>();
			sxs2.add("可行性研究方案内部审核意见：有关意见示例有关意见示例，有关意见示例有关意见示例，有关意见示例有关意见示例，有关意见示例。");
			lcxx2.setSx(sxs2);
			
			lcxxs.add(lcxx1);
			lcxxs.add(lcxx2);
			lx.setLcxxs(lcxxs);
			list.add(lx);
			
			
			Hjxx xmfwgszb=new Hjxx();
			xmfwgszb.setHjMc("项目服务公司招标");
			List<Lcxx> lcxxs2=new ArrayList<Lcxx>();
			Lcxx lcxx3=new Lcxx();
			lcxx3.setLcmc("招标方式确认");
			List<String> sxs3=new ArrayList<>();
			sxs3.add("项目服务公司招标方式决定时间，20xx年x月x日。");
			sxs3.add("项目服务公司招标方xxxx，20xx年x月x日。");
			lcxx3.setSx(sxs3);
			
			Lcxx lcxx4=new Lcxx();
			lcxx4.setLcmc("中标通知");
			List<String> sxs4=new ArrayList<>();
			sxs4.add("中标通知下发时间，20xx年x月x日。");
			lcxx4.setSx(sxs4);
			lcxxs2.add(lcxx3);
			lcxxs2.add(lcxx4);
			xmfwgszb.setLcxxs(lcxxs2);
			list.add(xmfwgszb);
			data.put("hjxxs", list);
			
			crateFile(data, "项目流程信息报告.ftl", "G:/文档导出/流程报告.doc");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}